/*
 * system init
 */
#include "stdint.h"
#include "sys_init.h"

void task_sw_hook(char pos);

/*******************************************************************************
* @brief  sysinit_start
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysinit_start(char pos)
{

}
OBJ_INIT_EXPORT(sysinit_start, "0");


/*******************************************************************************
* @brief  sysinit_board_end
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysinit_board_end(char pos)
{

}
OBJ_INIT_EXPORT(sysinit_board_end, "1.end");


/*******************************************************************************
* @brief  sysinit_end
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysinit_end(char pos)
{

}
OBJ_INIT_EXPORT(sysinit_end, "6.end");


/*******************************************************************************
* @brief  sysapp_end
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysapp_end(char pos)
{

}
OBJ_INIT_EXPORT(sysapp_end, "7.end");


/*******************************************************************************
* @brief  sys_hal_init
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_hal_init(void)
{
  char pos = 1;
  volatile const sys_init_fn *fn_ptr;

  for (fn_ptr = &__sys_init_sysinit_start; fn_ptr < &__sys_init_sysinit_board_end; fn_ptr++)
  {
    (*fn_ptr)(pos++);
  }
}

/*******************************************************************************
* @brief  sys_app_init
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_app_init(void)
{
  char pos = 1;
  volatile const sys_init_fn *fn_ptr;

  for (fn_ptr = &__sys_init_sysinit_board_end; fn_ptr < &__sys_init_sysinit_end; fn_ptr++)
  {
    (*fn_ptr)(pos++);
  }

}

/*******************************************************************************
* @brief  sys_init
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_init(void)
{
  sys_hal_init();
  sys_app_init();
}

/*******************************************************************************
* @brief  sys_app_run
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_app_run(void)
{
  volatile const sys_init_fn *fn_ptr;

  while (1)
  {
    char pos = 1;

    for (fn_ptr = &__sys_init_sysinit_end; fn_ptr < &__sys_init_sysapp_end; fn_ptr++)
    {
      (*fn_ptr)(pos++);
      task_sw_hook(pos);
    }
  }
}

/*******************************************************************************
* @brief  ram_clr
* \param[in] none
* \retval: none
*******************************************************************************/
void ram_clr(void)
{
  volatile register uint32_t *pdata;
  volatile register uint32_t Len;

  pdata = (uint32_t*)0x20000000;
  Len = 0x20000 / 4;
  while (Len--)
  {
    *pdata++ = 0;
  }
  
  pdata = (uint32_t*)0x10000000;
  Len = 0x10000 / 4;
  while (Len--)
  {
    *pdata++ = 0;
  }
}
